package remotos;

import integracion.converters.EnvioLogXmlConverter;
import integracion.converters.ErrorEnXmlException;
import integracion.converters.entidades.Resultado;

import java.rmi.RemoteException;
import java.util.Properties;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.xml.rpc.ServiceException;

import org.apache.log4j.Logger;

import Utils.Helpers;
import webservice.LogisticaMonitoreoBeanServiceLocator;
import webservice.LogisticaMonitoreoWS;

public class LogsLogistica {
	
	private static Logger logger = Logger.getLogger(ComprasLogistica.class);
	// Set up all the default values
    private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
    private static final String DEFAULT_DESTINATION = "jms/queue/log";
    private static final String DEFAULT_USERNAME = "log";
    private static final String DEFAULT_PASSWORD = "log1234";
    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
    private static final String PROVIDER_URL = "remote://localhost:4447";
    
	
	public static String logMessage(String m){
		
		String resultado = "";
		//verifica si tiene que llamar al metodo sincronico o asincronico
		boolean async = Boolean.valueOf(Helpers.getConfiguration().get("LogisticaLogsAsyncFlag"));

		if(async){
			//llama al metodo asincronico de log de logistica
			logAsync(m);			
		}else{
			//llama al metodo sincronico de log de logistica
			//retorna un "OK" o "ERROR" desde ws
			resultado = logSync(m);
		}
		
		return resultado;
	}
	
	
	private static String logSync(String message){
		String respuesta = "";
		String xml;
		EnvioLogXmlConverter converter = new EnvioLogXmlConverter();
		try {
			xml = converter.getXml(message);			
			LogisticaMonitoreoWS port = new LogisticaMonitoreoBeanServiceLocator().getLogisticaMonitoreoWSPort();
			respuesta = port.informarLog(xml);
			Resultado resultado = converter.getResultado(respuesta);
			return resultado.getEstado();
			
		} catch (ErrorEnXmlException e1) {		
			logger.error("Error al crear el xml de envio de log a Logistica.");
			logger.error(e1);
			e1.printStackTrace();
		} catch (ServiceException e2) {
			
			logger.error("Error en la llamada a WebService .");
			logger.error(e2);
			
		} catch (RemoteException e3) {
			
			logger.error("Error en la llamada a WebService .");
			logger.error(e3);
		}
		catch (Exception e) {			
			logger.error("Error en la llamada a WebService .");
			logger.error(e);
		}
		
		return "ERROR";
		
	}
	
	private static String logAsync(String message){
		
		String resultado = "OK";
		
		ConnectionFactory connectionFactory = null;
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        Destination destination = null;
        Context context = null;
        
        String xml;
		EnvioLogXmlConverter converter = new EnvioLogXmlConverter();

        // Set up the context for the JNDI lookup
        final Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
        env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, Helpers.getConfiguration().get("LogisticaLogsMDBAddr")));
        env.put(Context.SECURITY_PRINCIPAL, System.getProperty("username",  Helpers.getConfiguration().get("LogisticaLogsMDBUser")));
        env.put(Context.SECURITY_CREDENTIALS, System.getProperty("password",  Helpers.getConfiguration().get("LogisticaLogsMDBPass")));
        try {
			context = new InitialContext(env);
			// Perform the JNDI lookups
	        String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
	        connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryString);
	        
	        String destinationString = System.getProperty("destination", Helpers.getConfiguration().get("LogisticaLogsMDBDest"));
	        destination = (Destination) context.lookup(destinationString);	        
		
			connection = connectionFactory.createConnection(System.getProperty("username", Helpers.getConfiguration().get("LogisticaLogsMDBUser")), 
					System.getProperty("password", Helpers.getConfiguration().get("LogisticaLogsMDBPass")));
			
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			producer = session.createProducer(destination);
			connection.start();
			// crear un mensaje de tipo text y setearle el contenido
			TextMessage mensajeXML = session.createTextMessage();
			xml = converter.getXml(message);			
			mensajeXML.setText(xml);
			// enviar el mensaje
			producer.send(mensajeXML);
			connection.close();
		} catch (JMSException e) {
			logger.error(e.getMessage());
			resultado = "ERROR";
		}catch (ErrorEnXmlException e1) {		
			logger.error("Error al crear el xml de envio de log a Logistica.");
			logger.error(e1);			
			resultado = "ERROR";
		}catch (NamingException e) {
			logger.error("Error al encontrar la cola de mensajes de Logs");
			logger.error(e.getMessage());
			resultado = "ERROR";
		}
        catch(Exception ex){
			logger.error("Error al llamar a la cola de mensajes de Logs");
			logger.error(ex);			
			resultado = "ERROR";			
		}
        
        return resultado;
	}
	

}
